home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smtp_func.inc < prev    next >
Text File  |  2005-03-31  |  4KB  |  168 lines

  1. # -*- Fundamental -*-
  2. #
  3. # (C) 2002 Michel Arboi <arboi@alussinan.org>
  4. # $Revision: 1.26 $
  5.  
  6. function smtp_close(socket)
  7. {
  8.   send(socket: socket, data: 'QUIT\r\n');
  9.   smtp_recv_line(socket: socket);
  10.   close(socket);
  11. }
  12.  
  13. function smtp_open(port, helo)
  14. {
  15.   local_var    soc, data;
  16.  
  17.   soc = open_sock_tcp(port);
  18.   if (! soc) return NULL;
  19.  
  20.   data = smtp_recv_banner(socket:soc);
  21.   if (! data)
  22.   {
  23.     smtp_close(socket: soc);
  24.     return NULL;
  25.   }
  26.   
  27.   if ( isnull(helo) ) return soc;
  28.  
  29.   send(socket:soc, data: strcat('HELO ', helo, '\r\n'));
  30.   data = smtp_recv_line(socket: soc);
  31.   if(! ereg(pattern:"^[2-3][0-9][0-9]", string:data))
  32.   {
  33.     smtp_close(socket: soc);
  34.     return NULL;
  35.   }
  36.  
  37.   return soc;  
  38. }
  39.  
  40. function smtp_send_socket(socket, from, to, body)
  41. {
  42.   local_var buff;
  43.   # display(string("smtp_send_socket from=", from, " to=", to, "\n"));
  44.   # Just to be sure
  45.   send(socket: socket, data: string("RSET\r\n"));
  46.   buff = recv_line(socket: socket, length: 2048);
  47.   # Here, we might test the return code
  48.   if (from !~ ' *<.*> *') from = strcat('<', from, '>');
  49.   send(socket: socket, data: string("MAIL FROM: ", from, "\r\n"));
  50.   buff = recv_line(socket: socket, length: 2048);
  51.   if (! ereg(pattern:"^2[0-9][0-9] ", string:buff)) { return (0); }
  52.   
  53.   if (to !~ ' *<.*> *') to = strcat('<', to, '>');
  54.   send(socket: socket, data: string("RCPT TO: ", to, "\r\n"));
  55.   buff = recv_line(socket: socket, length: 2048);
  56.   if (! ereg(pattern:"^2[0-9][0-9] ", string:buff)) { return (0); }
  57.  
  58.   send(socket: socket, data: string("DATA\r\n"));
  59.   buff = recv_line(socket: socket, length: 2048);
  60.   if (! ereg(pattern:"^3[0-9][0-9] ", string:buff)) { return (0); }
  61.  
  62.   # Make sure that every line ends up with \r\n
  63.   # This is not useful yet, as only two scripts send data to the SMTP server
  64.   #body = ereg_replace(string: body, pattern: string("([^\r])\n"), replace: string("\\1\r\n"));
  65.   send(socket: socket, data: body);
  66.   send(socket: socket, data: string("\r\n.\r\n"));
  67.   buff = recv_line(socket: socket, length: 2048);
  68.   if (! ereg(pattern:"^2[0-9][0-9] ", string:buff)) { return (0); }
  69.   return(1);
  70. }
  71.  
  72. function smtp_send_port(port, from, to, body)
  73. {
  74.   local_var s, buff, ret;
  75.   s = open_sock_tcp(port);
  76.   if (! s) return (0);
  77.  
  78.   buff = recv_line(socket: s, length: 2048);
  79.   send(socket: s, data: string("HELO nessus\r\n"));
  80.   buff = recv_line(socket: s, length: 2048);
  81.   # We should test the code
  82.   ret = smtp_send_socket(socket: s, from: from, to: to, body: body);
  83.   send(socket: s, data: string("QUIT\r\n"));
  84.   close(s);
  85.   return (ret);
  86. }
  87.  
  88. function smtp_from_header()
  89. {
  90.  local_var fromaddr;
  91.  fromaddr = get_kb_item("SMTP/headers/From");
  92.  if (!fromaddr) fromaddr = "nessus@example.com";
  93.  return (fromaddr);
  94. }
  95.  
  96. function smtp_to_header()
  97. {
  98.  local_var toaddr;
  99.  toaddr = get_kb_item("SMTP/headers/To");
  100.  if (!toaddr) toaddr = string("postmaster@[", get_host_ip(), "]");
  101.  return (toaddr);
  102. }
  103.  
  104. function get_smtp_banner(port)
  105. {
  106.   local_var sb, banner, soc;
  107.   
  108.   sb = string("smtp/banner/", port);
  109.   banner = get_kb_item(sb);
  110.   if(banner) return (banner);
  111.   if ( get_kb_item("smtp/" + port + "/broken") ) 
  112.     return NULL;
  113.  
  114.   if(! get_port_state(port)) return (0);
  115.   soc = open_sock_tcp(port);
  116.   if (! soc) {
  117.     set_kb_item(name:"smtp/" + port + "/broken", value:TRUE);
  118.     return NULL;
  119.     }
  120.   banner =  smtp_recv_banner(socket: soc);
  121.   close(soc);
  122.   if(! banner ) {
  123.     set_kb_item(name:"smtp/" + port + "/broken", value:TRUE);
  124.     return NULL;
  125.     }
  126.     
  127.   
  128.   if ( defined_func("replace_kb_item") )
  129.       replace_kb_item(name: sb, value: banner);
  130.   else
  131.       set_kb_item(name: sb, value: banner);
  132.   return(banner);
  133. }
  134.  
  135.  
  136. function smtp_recv_line(socket, code)
  137. {
  138.  local_var ret, n, r, pattern;
  139.  
  140.  if (isnull(code))
  141.    pat = "^[0-9][0-9][0-9]-";
  142.  else
  143.    pat = strcat("^", code, "-");
  144.  
  145.  ret = "";
  146.  n = 0;
  147.  r = recv_line(socket:socket, length:4096);
  148.  ret = r;
  149.  if(strlen(r) < 4) 
  150.   return r;
  151.   
  152.  while(ereg(pattern: pat, string:r))
  153.  {
  154.   n = n + 1;
  155.   r = recv_line(socket:socket, length:4096);
  156.   if (n > 512)
  157.    return NULL;
  158.   ret = string( ret, r);
  159.  }
  160.  return ret;
  161. }
  162.  
  163. function smtp_recv_banner(socket)
  164. {
  165.   return smtp_recv_line(socket: socket, code: "220");
  166. }
  167.  
  168.